package com.gsbelarus.gedemin.income.fragment;

import android.content.Intent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;

import com.gsbelarus.gedemin.income.adapter.ClientsListSimpleAdapter;
import com.gsbelarus.gedemin.income.table.ClientsTable;
import com.gsbelarus.gedemin.income.R;
import com.gsbelarus.gedemin.income.activity.ClientYear;
import com.gsbelarus.gedemin.income.adapter.ClientsListAdapter;
import com.gsbelarus.gedemin.income.sync.DataBaseHelper;
import com.gsbelarus.gedemin.lib.ui.ArgumentsHelper;
import com.gsbelarus.gedemin.lib.Utils;
import com.gsbelarus.gedemin.lib.ui.fragment.ListFragmentModel;

import java.util.List;

/**
 * Клиенты за месяц
 * (Меню - За месяц)
 * 1. Action Bar содержит календарь выбора месяца.
 * 2. В списке отображаются только клиенты, которые в указанном месяце платили
 * предприятию. Изначально список открывается для текущего месяца.
 * 3. Записи отсортированы в алфавитном порядке.
 * 4. Action Bar содержит строку ввода для фильтра по вхождению.
 * 5. Список содержит: Наименование, Оплаченную сумму, Плановую сумму (если
 * она есть), Процент. Цвет фона записи показывает соотношение оплаченной
 * суммы к плановой.
 * 6. Тач записи переводит на экран Клиент.
 */
public class ClientsMonthListFrgm extends ListFragmentModel {

    /**
     * данные, полученные из БД, для вывода в list:
     * ClientsTable.id - id клиента
     * ClientsTable.name - имя клиента
     * ClientsTable.paidSum - оплаченная сумма за месяц
     * ClientsTable.planSum - плановая сумма за месяц
     */
    private List<ClientsTable> contacts;
    private ClientsTable objIncome;

    /**
     * связывает массив contacts с компонентом отображения list
     * (нужен в качестве глобальной переменной для поиска)
     */
    private ClientsListAdapter adapter;

    /**
     * Вызывается при создании View или при смене ориентации экрана.
     * Может быть переопределен в классе наследнике
     *
     * @param rootView корневое View
     */
    @Override
    public void onCreateViewFragment(View rootView) {
        super.onCreateViewFragment(rootView);

        String selectedMonthName = Utils.getMonthName(context, argumentsHelper.selectedMonth - 1);
        TextView textSum = (TextView) rootView.findViewById(R.id.client_list_item_name);
        textSum.setText(selectedMonthName + " " + String.valueOf(argumentsHelper.selectedYear));
    }

    @Override
    public Integer getHeaderId() {
        return R.layout.header_list_sums;
    }

    /**
     * обработчик нажатия на элемент списка:
     * создается интент для запуска нового потока (activity) ClientYear
     * для открытия формы Клиент.
     * В качестве параметров передаются выбранные год, месяц, ИД клиента, имя клиента
     */
    @Override
    public void onListItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        Intent intent = new Intent(getActivity(), ClientYear.class);
        intent.putExtra(ArgumentsHelper.ID, adapter.getItem(position).getId());
        intent.putExtra(ArgumentsHelper.SELECTED_YEAR, argumentsHelper.selectedYear);
        intent.putExtra(ArgumentsHelper.CLIENT_NAME, adapter.getItem(position).getName());
        startActivity(intent);
    }

    /**
     * Чтение данных из БД в новом потоке
     */
    @Override
    public void readDataBase() {
        DataBaseHelper dbh = DataBaseHelper.getInstance(context);
        contacts = dbh.getClientsMonthList(argumentsHelper.selectedMonth, argumentsHelper.selectedYear);
        objIncome = dbh.getClientsMonthSum(argumentsHelper.selectedMonth, argumentsHelper.selectedYear);
    }

    /**
     * Метод вызывается после чтения данных из БД или при смене ориентации экрана.
     * Может быть вызван до окончания выполнения потока для запроса данных из БД, поэтому следует проверять данные на null.
     * Служит для инициализации View данными
     *
     * @param rootView корневое View
     */
    @Override
    public void initView(View rootView) {
        if (contacts == null || objIncome == null)
            return;
        adapter = new ClientsListAdapter(context, contacts);
        list.setAdapter(adapter);

        /**
         * Статический компонент на форме под заголовком.
         * Обновляется после чтения данных из БД.
         * Выводится: дата,
         * оплаченная сумма по всем клиентам на дату,
         * плановая сумма по всем клиентам на дату
         * Если плановая сумма 0, выводится только дата и оплаченная сумма
         */
        ClientsListSimpleAdapter headerAdapter = new ClientsListSimpleAdapter(context);
        headerAdapter.changeVisibilityPaidText(rootView, View.VISIBLE);
        if (objIncome.getPlanSum() > 0) {
            headerAdapter.changeVisibilityPlanText(rootView, View.VISIBLE);
            headerAdapter.changeVisibilityPercent(rootView, View.VISIBLE);

            if (headerAdapter.isFuturePeriod(objIncome))
                headerAdapter.changeVisibilityPlanImage(rootView, View.INVISIBLE);
            else
                headerAdapter.changeVisibilityPlanImage(rootView, View.VISIBLE);
        }
        headerAdapter.adaptView(rootView, objIncome);
    }

    @Override
    public ClientsListAdapter getAdapter() {
        return adapter;
    }
}
